//+------------------------------------------------------------------+
//|                                                   processenv.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include <WinAPI/windef.h>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#import "kernel32.dll"
/// 设置环境字符串
/// @param new_environment 新的环境字符串
/// @return 操作结果(成功为非零)
int SetEnvironmentStringsW(string new_environment);

/// 获取标准句柄
/// @param std_handle 标准句柄类型(STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, STD_ERROR_HANDLE)
/// @return 标准句柄
HANDLE GetStdHandle(uint std_handle);

/// 设置标准句柄
/// @param std_handle 标准句柄类型
/// @param handle 要设置的句柄
/// @return 操作结果(成功为非零)
int SetStdHandle(uint std_handle, HANDLE handle);

/// 设置标准句柄(扩展版本)
/// @param std_handle 标准句柄类型
/// @param handle 要设置的句柄
/// @param prev_value 返回之前的句柄
/// @return 操作结果(成功为非零)
int SetStdHandleEx(uint std_handle, HANDLE handle, HANDLE &prev_value);

/// 获取命令行字符串
/// @return 命令行字符串
string GetCommandLineW(void);

/// 获取环境字符串
/// @return 环境字符串块
string GetEnvironmentStringsW(void);

/// 释放环境字符串块
/// @param v 环境字符串块
/// @return 操作结果(成功为非零)
int FreeEnvironmentStringsW(string v);

/// 获取环境变量值
/// @param name 变量名
/// @param buffer 存储变量值的缓冲区
/// @param size 缓冲区大小
/// @return 实际写入的字符数
uint GetEnvironmentVariableW(const string name, ushort &buffer[], uint size);

/// 设置环境变量
/// @param name 变量名
/// @param value 变量值
/// @return 操作结果(成功为非零)
int SetEnvironmentVariableW(const string name, const string value);

/// 扩展环境变量字符串
/// @param src 包含环境变量的源字符串
/// @param dst 扩展后的目标字符串
/// @param size 目标缓冲区大小
/// @return 实际需要的缓冲区大小
uint ExpandEnvironmentStringsW(const string src, string dst, uint size);

/// 设置当前工作目录
/// @param path_name 新目录路径
/// @return 操作结果(成功为非零)
int SetCurrentDirectoryW(const string path_name);

/// 获取当前工作目录
/// @param buffer_length 缓冲区长度
/// @param buffer 存储目录的缓冲区
/// @return 实际写入的字符数
uint GetCurrentDirectoryW(uint buffer_length, ushort &buffer[]);

/// 获取当前工作目录(字符串版本)
/// @param buffer_length 缓冲区长度
/// @param buffer 存储目录的字符串
/// @return 实际写入的字符数
uint GetCurrentDirectoryW(uint buffer_length, string &buffer);

/// 搜索文件路径
/// @param path 搜索路径
/// @param file_name 文件名
/// @param extension 文件扩展名
/// @param buffer_length 缓冲区长度
/// @param buffer 存储完整路径的缓冲区
/// @param file_part 返回文件部分指针
/// @return 实际写入的字符数
uint SearchPathW(const string path, const string file_name, const string extension, 
                uint buffer_length, ushort &buffer[], string &file_part);

/// 检查可执行路径是否需要当前目录
/// @param exe_name 可执行文件名
/// @return 是否需要当前目录(1为需要)
int NeedCurrentDirectoryForExePathW(const string exe_name);
#import
//+------------------------------------------------------------------+